<?php

namespace App\Http\Resources;

use Illuminate\Support\Str;
use Illuminate\Http\Resources\Json\JsonResource;
use App\Http\Resources\Traits\Response;
use App\Models\Game\Platform\Org;

class Resource extends JsonResource
{
    use Response;

    /**
     * 保留数组下标
     *
     * @var bool
     */
    public $preserveKeys = true;

    /**
     * Create a new resource instance.
     *
     * @param mixed ...$parameters
     * @return static
     */
    public static function create(...$parameters)
    {
        if (!!config('elasticsearch.default')) {
            // 基础类名
            $name = class_basename(static::class);
            // 类名解析
            $class = Str::replaceLast($name, "Elasticsearch\\{$name}", static::class);
            // 存在则创建
            if (class_exists($class)) {
                return new $class(...$parameters);
            }
        }

        return new static(...$parameters);
    }

    /**
     * 平台列表
     *
     * @var array
     */
    protected $orgs;

    /**
     * 获取平台列表，code为下标
     *
     * @param array $codes
     * @param bool $isArray
     * @return array
     */
    protected function getOrgs(array $codes, $isArray = true): array
    {
        if (is_null($this->orgs)) {
            $this->orgs = Org::dbTable()
                ->selectRaw('code,name')
                ->whereIn('code', $codes)
                ->get();

            if ($isArray) {
                $this->orgs = $this->orgs->keyBy('code')->toArray();
            } else {
                $this->orgs = $this->orgs->pluck('name', 'code')->toArray();
            }
        }
        return $this->orgs;
    }

    /**
     * 追加数据到数据集合
     *
     * @param array $codes
     * @param bool $isArray
     * @return $this
     */
    public function setOrgs(array $codes, $isArray = true)
    {
        $this->offsetSet('orgs', $this->getOrgs($codes, $isArray));

        return $this;
    }

    /**
     * 制作数据列表【平台】
     *
     * @param array $datas
     * @return array
     */
    protected function makeDatasOrg(array $datas): array
    {
        if (!isset($datas[0]['plat_code'])) {
            return $datas;
        }
        // 平台列表
        $this->getOrgs(array_unique(array_column($datas, 'plat_code')));
        // 平台信息
        return array_map(function ($item) {
            return $item + ['org' => $this->orgs[$item['plat_code']] ?? null];
        },
            $datas
        );
    }
}
